#this lines of code install these packages in your RStudio workspace
install.packages("dplyr")
Error in install.packages : Updating loaded packages
install.packages("leaflet")
Error in install.packages : Updating loaded packages
install.packages("ggplot2")
Error in install.packages : Updating loaded packages
install.packages("ggplot")
Warning in install.packages :
package ‘ggplot’ is not available for this version of R
A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
install.packages("plotly")
Error in install.packages : Updating loaded packages
#this code invoke the same packages in your open Rmarkdown file (which is this file that you are reading now)
#to plot and visualize your data
library(sf)
library(sp)
library(ggplot2)
library(dplyr)
library(leaflet)
library(plotly)
library(sfheaders)
library(survival)
library(survminer)
Loading the causes data.
From the Monarch Bills I’ve created 4 different data frames, one for
each of the illnesses that I’ve extracted so far; infant, chrisoms,
stillborne, and abortive. Each data frame contained the parish name,
standardized to the Omeka form, and the counts per year starting off
from 1665, to 1669. I am going to send you de data sets, so you can load
them from your directory.
abortive <- read.csv("/Users/hernanadasme/Projects/bom/abortive_1665_1669.csv")
stilborne <- read.csv("/Users/hernanadasme/Projects/bom/stilborne_1665_1669.csv")
infant <- read.csv("/Users/hernanadasme/Projects/bom/infant_1665_1669.csv")
chrisoms <- read.csv("/Users/hernanadasme/Projects/bom/chrisoms_1665_1669.csv")
check the one of the data frames
head(abortive)
Loading the parishes polygons
Here I am loading a shapefile. Shapefiles are a collection of files
that contain geo referenced data. You only need to pull the file with
the .shp extension and it will load all the required files. I will send
you this file too, and we can load it into a folder. Here we are using
the parishes from 1671; I am only assuming that those would be more
accurate for the type of analysis that we want to do.
parishes_1671 <- st_read("//Users/hernanadasme/Projects/bom/parish-shapefiles/WithinTheBills1671/WithinTheBills1671.shp")
Reading layer `WithinTheBills1671' from data source `/Users/hernanadasme/Projects/bom/parish-shapefiles/WithinTheBills1671/WithinTheBills1671.shp' using driver `ESRI Shapefile'
Simple feature collection with 132 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 525498.1 ymin: 170682.5 xmax: 537668.6 ymax: 188172.2
Projected CRS: OSGB36 / British National Grid
Merging the parishes data with the individual diseases data
frames
I standardized the names of the parishes to match them with one of
the possible names in the data set that contains the parishes polygons.
That explains why the diseases data sets have a column named OMEKA_PAR,
which matches with the same column in the 1671 parishes shape file.
Having the same column allow us to merge the data frames and create one
data frame with the parish name, the cause of death, the counts per
year, and the georeferenced data with the polygons. I will perform two
types of joins: left join and inner join.
Inner join:
An inner join only includes rows that have matching values in both
the left and right tables.. In this case, only includes the parishes
which contain data from the original abortive data frame.
# Perform a left join to combine the data based on a shared parish identifier. e.
map_abortive <- inner_join(parishes_1671, abortive, by = "OMEKA_PAR")
check the data
#to better see the data, we can transform the joined table into a data frame view
map_abortive_df <- as.data.frame(map_abortive)
map_abortive_df
Mapping the left joined data
centroids <- st_centroid(map_abortive$geometry)
# Add centroids to the data frame
map_abortive$centroid_x <- st_coordinates(centroids)[, "X"]
map_abortive$centroid_y <- st_coordinates(centroids)[, "Y"]
plot_av <- ggplot(data = map_abortive , aes(fill = X1669 )) +
geom_sf() +
geom_text(aes(x = centroid_x, y = centroid_y, label = OMEKA_PAR),
color = "grey", size = 1, show.legend = FALSE, alpha=0)+
scale_fill_gradient(low = "white", high = "red", na.value = "gray",
breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800),
labels = scales::comma_format()) +
theme_void()
# Convert ggplot to plotly
plotly_map <- ggplotly(plot_av)
# Display the interactive plot
plotly_map
Left join:
A left join includes all the rows from the left (or first) table and
matching rows from the right (or second) table. In this case, includes
the parishes which contain data from the original abortive data frame
and all the 106 parishes with no data, from the shapefile
leftjoined_abortive <- left_join(parishes_1671, abortive, by = "OMEKA_PAR")
map_leftjoined_abortive <- as.data.frame(leftjoined_abortive)
map_leftjoined_abortive
centroids <- st_centroid(leftjoined_abortive$geometry)
# Add centroids to the data frame
leftjoined_abortive$centroid_x <- st_coordinates(centroids)[, "X"]
leftjoined_abortive$centroid_y <- st_coordinates(centroids)[, "Y"]
plot_av_all <- ggplot(data = leftjoined_abortive , aes(fill = X1665 )) +
geom_sf() +
geom_text(aes(x = centroid_x, y = centroid_y, label = OMEKA_PAR),
color = "grey", size = 1, show.legend = FALSE, alpha=0)+
scale_fill_gradient(low = "white", high = "red", na.value = "gray",
breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800),
labels = scales::comma_format()) +
theme_void()
# Convert ggplot to plotly
plotly_map_all <- ggplotly(plot_av_all)
# Display the interactive plot
plotly_map_all
Now we do the same with the infants data set
leftjoined_infant <- left_join(parishes_1671, infant, by = "OMEKA_PAR")
map_infants_df <- as.data.frame(leftjoined_infant)
map_infants_df
centroids <- st_centroid(leftjoined_infant$geometry)
# Add centroids to the data frame
leftjoined_infant$centroid_x <- st_coordinates(centroids)[, "X"]
leftjoined_infant$centroid_y <- st_coordinates(centroids)[, "Y"]
plot_inf_all <- ggplot(data = leftjoined_infant, aes(fill = X1669 )) +
geom_sf() +
geom_text(aes(x = centroid_x, y = centroid_y, label = OMEKA_PAR),
color = "grey", size = 1, show.legend = FALSE, alpha=0)+
scale_fill_gradient(low = "white", high = "red", na.value = "gray",
breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800),
labels = scales::comma_format()) +
theme_void()
# Convert ggplot to plotly
plotly_inf_all <- ggplotly(plot_inf_all)
# Display the interactive plot
plotly_inf_all
LS0tCnRpdGxlOiAiSW5mYW50IENhdXNlcyBvZiBEZWF0aDogTW9uYXJjaCBCaWxscyAxNjY1IC0gMTY2OSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiN0aGlzIGxpbmVzIG9mIGNvZGUgaW5zdGFsbCB0aGVzZSBwYWNrYWdlcyBpbiB5b3VyIFJTdHVkaW8gd29ya3NwYWNlCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikKaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QiKQppbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQpgYGAKCmBgYHtyfQojdGhpcyBjb2RlIGludm9rZSB0aGUgc2FtZSBwYWNrYWdlcyBpbiB5b3VyIG9wZW4gUm1hcmtkb3duIGZpbGUgKHdoaWNoIGlzIHRoaXMgZmlsZSB0aGF0IHlvdSBhcmUgcmVhZGluZyBub3cpCiN0byBwbG90IGFuZCB2aXN1YWxpemUgeW91ciBkYXRhCmxpYnJhcnkoc2YpCmxpYnJhcnkoc3ApCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShzZmhlYWRlcnMpCmxpYnJhcnkoc3Vydml2YWwpCmxpYnJhcnkoc3Vydm1pbmVyKQpgYGAKCiMjIyBMb2FkaW5nIHRoZSBjYXVzZXMgZGF0YS4KCkZyb20gdGhlIE1vbmFyY2ggQmlsbHMgSSd2ZSBjcmVhdGVkIDQgZGlmZmVyZW50IGRhdGEgZnJhbWVzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGlsbG5lc3NlcyB0aGF0IEkndmUgZXh0cmFjdGVkIHNvIGZhcjsgaW5mYW50LCBjaHJpc29tcywgc3RpbGxib3JuZSwgYW5kIGFib3J0aXZlLiBFYWNoIGRhdGEgZnJhbWUgY29udGFpbmVkIHRoZSBwYXJpc2ggbmFtZSwgc3RhbmRhcmRpemVkIHRvIHRoZSBPbWVrYSBmb3JtLCBhbmQgdGhlIGNvdW50cyBwZXIgeWVhciBzdGFydGluZyBvZmYgZnJvbSAxNjY1LCB0byAxNjY5LiBJIGFtIGdvaW5nIHRvIHNlbmQgeW91IGRlIGRhdGEgc2V0cywgc28geW91IGNhbiBsb2FkIHRoZW0gZnJvbSB5b3VyIGRpcmVjdG9yeS4KCmBgYHtyfQphYm9ydGl2ZSA8LSByZWFkLmNzdigiL1VzZXJzL2hlcm5hbmFkYXNtZS9Qcm9qZWN0cy9ib20vYWJvcnRpdmVfMTY2NV8xNjY5LmNzdiIpCnN0aWxib3JuZSA8LSByZWFkLmNzdigiL1VzZXJzL2hlcm5hbmFkYXNtZS9Qcm9qZWN0cy9ib20vc3RpbGJvcm5lXzE2NjVfMTY2OS5jc3YiKQppbmZhbnQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9oZXJuYW5hZGFzbWUvUHJvamVjdHMvYm9tL2luZmFudF8xNjY1XzE2NjkuY3N2IikKY2hyaXNvbXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9oZXJuYW5hZGFzbWUvUHJvamVjdHMvYm9tL2Nocmlzb21zXzE2NjVfMTY2OS5jc3YiKQpgYGAKCmNoZWNrIHRoZSBvbmUgb2YgdGhlIGRhdGEgZnJhbWVzCgpgYGB7cn0KaGVhZChhYm9ydGl2ZSkKYGBgCgojIyMgTG9hZGluZyB0aGUgcGFyaXNoZXMgcG9seWdvbnMKCkhlcmUgSSBhbSBsb2FkaW5nIGEgc2hhcGVmaWxlLiBTaGFwZWZpbGVzIGFyZSBhIGNvbGxlY3Rpb24gb2YgZmlsZXMgdGhhdCBjb250YWluIGdlbyByZWZlcmVuY2VkIGRhdGEuIFlvdSBvbmx5IG5lZWQgdG8gcHVsbCB0aGUgZmlsZSB3aXRoIHRoZSAuc2hwIGV4dGVuc2lvbiBhbmQgaXQgd2lsbCBsb2FkIGFsbCB0aGUgcmVxdWlyZWQgZmlsZXMuIEkgd2lsbCBzZW5kIHlvdSB0aGlzIGZpbGUgdG9vLCBhbmQgd2UgY2FuIGxvYWQgaXQgaW50byBhIGZvbGRlci4gSGVyZSB3ZSBhcmUgdXNpbmcgdGhlIHBhcmlzaGVzIGZyb20gMTY3MTsgSSBhbSBvbmx5IGFzc3VtaW5nIHRoYXQgdGhvc2Ugd291bGQgYmUgbW9yZSBhY2N1cmF0ZSBmb3IgdGhlIHR5cGUgb2YgYW5hbHlzaXMgdGhhdCB3ZSB3YW50IHRvIGRvLgoKYGBge3J9CnBhcmlzaGVzXzE2NzEgPC0gc3RfcmVhZCgiLy9Vc2Vycy9oZXJuYW5hZGFzbWUvUHJvamVjdHMvYm9tL3BhcmlzaC1zaGFwZWZpbGVzL1dpdGhpblRoZUJpbGxzMTY3MS9XaXRoaW5UaGVCaWxsczE2NzEuc2hwIikKYGBgCgojIyMgTWVyZ2luZyB0aGUgcGFyaXNoZXMgZGF0YSB3aXRoIHRoZSBpbmRpdmlkdWFsIGRpc2Vhc2VzIGRhdGEgZnJhbWVzCgpJIHN0YW5kYXJkaXplZCB0aGUgbmFtZXMgb2YgdGhlIHBhcmlzaGVzIHRvIG1hdGNoIHRoZW0gd2l0aCBvbmUgb2YgdGhlIHBvc3NpYmxlIG5hbWVzIGluIHRoZSBkYXRhIHNldCB0aGF0IGNvbnRhaW5zIHRoZSBwYXJpc2hlcyBwb2x5Z29ucy4gVGhhdCBleHBsYWlucyB3aHkgdGhlIGRpc2Vhc2VzIGRhdGEgc2V0cyBoYXZlIGEgY29sdW1uIG5hbWVkIE9NRUtBX1BBUiwgd2hpY2ggbWF0Y2hlcyB3aXRoIHRoZSBzYW1lIGNvbHVtbiBpbiB0aGUgMTY3MSBwYXJpc2hlcyBzaGFwZSBmaWxlLiBIYXZpbmcgdGhlIHNhbWUgY29sdW1uIGFsbG93IHVzIHRvIG1lcmdlIHRoZSBkYXRhIGZyYW1lcyBhbmQgY3JlYXRlIG9uZSBkYXRhIGZyYW1lIHdpdGggdGhlIHBhcmlzaCBuYW1lLCB0aGUgY2F1c2Ugb2YgZGVhdGgsIHRoZSBjb3VudHMgcGVyIHllYXIsIGFuZCB0aGUgZ2VvcmVmZXJlbmNlZCBkYXRhIHdpdGggdGhlIHBvbHlnb25zLiBJIHdpbGwgcGVyZm9ybSB0d28gdHlwZXMgb2Ygam9pbnM6IGxlZnQgam9pbiBhbmQgaW5uZXIgam9pbi4KCiMjIyMgSW5uZXIgam9pbjoKCkFuIGlubmVyIGpvaW4gb25seSBpbmNsdWRlcyByb3dzIHRoYXQgaGF2ZSBtYXRjaGluZyB2YWx1ZXMgaW4gYm90aCB0aGUgbGVmdCBhbmQgcmlnaHQgdGFibGVzLi4gSW4gdGhpcyBjYXNlLCBvbmx5IGluY2x1ZGVzIHRoZSBwYXJpc2hlcyB3aGljaCBjb250YWluIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgYWJvcnRpdmUgZGF0YSBmcmFtZS4KCmBgYHtyfQojIFBlcmZvcm0gYSBsZWZ0IGpvaW4gdG8gY29tYmluZSB0aGUgZGF0YSBiYXNlZCBvbiBhIHNoYXJlZCBwYXJpc2ggaWRlbnRpZmllci4gZS4KbWFwX2Fib3J0aXZlIDwtIGlubmVyX2pvaW4ocGFyaXNoZXNfMTY3MSwgYWJvcnRpdmUsIGJ5ID0gIk9NRUtBX1BBUiIpCmBgYAoKY2hlY2sgdGhlIGRhdGEKCmBgYHtyfQojdG8gYmV0dGVyIHNlZSB0aGUgZGF0YSwgd2UgY2FuIHRyYW5zZm9ybSB0aGUgam9pbmVkIHRhYmxlIGludG8gYSBkYXRhIGZyYW1lIHZpZXcKbWFwX2Fib3J0aXZlX2RmIDwtIGFzLmRhdGEuZnJhbWUobWFwX2Fib3J0aXZlKQptYXBfYWJvcnRpdmVfZGYKYGBgCgpNYXBwaW5nIHRoZSBsZWZ0IGpvaW5lZCBkYXRhCgpgYGB7cn0KY2VudHJvaWRzIDwtIHN0X2NlbnRyb2lkKG1hcF9hYm9ydGl2ZSRnZW9tZXRyeSkKCiMgQWRkIGNlbnRyb2lkcyB0byB0aGUgZGF0YSBmcmFtZQptYXBfYWJvcnRpdmUkY2VudHJvaWRfeCA8LSBzdF9jb29yZGluYXRlcyhjZW50cm9pZHMpWywgIlgiXQptYXBfYWJvcnRpdmUkY2VudHJvaWRfeSA8LSBzdF9jb29yZGluYXRlcyhjZW50cm9pZHMpWywgIlkiXQoKcGxvdF9hdiA8LSBnZ3Bsb3QoZGF0YSA9IG1hcF9hYm9ydGl2ZSAsIGFlcyhmaWxsID0gWDE2NjkgKSkgKwogIGdlb21fc2YoKSArCiAgZ2VvbV90ZXh0KGFlcyh4ID0gY2VudHJvaWRfeCwgeSA9IGNlbnRyb2lkX3ksIGxhYmVsID0gT01FS0FfUEFSKSwKICAgICAgICAgICAgY29sb3IgPSAiZ3JleSIsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBhbHBoYT0wKSsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIiwgbmEudmFsdWUgPSAiZ3JheSIsCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMjAwLCAzMDAsIDQwMCwgNTAwLCA2MDAsIDcwMCwgODAwKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6Y29tbWFfZm9ybWF0KCkpICsKICB0aGVtZV92b2lkKCkKCiMgQ29udmVydCBnZ3Bsb3QgdG8gcGxvdGx5CnBsb3RseV9tYXAgPC0gZ2dwbG90bHkocGxvdF9hdikKCiMgRGlzcGxheSB0aGUgaW50ZXJhY3RpdmUgcGxvdApwbG90bHlfbWFwCmBgYAoKIyMjIyBMZWZ0IGpvaW46CgpBIGxlZnQgam9pbiBpbmNsdWRlcyBhbGwgdGhlIHJvd3MgZnJvbSB0aGUgbGVmdCAob3IgZmlyc3QpIHRhYmxlIGFuZCBtYXRjaGluZyByb3dzIGZyb20gdGhlIHJpZ2h0IChvciBzZWNvbmQpIHRhYmxlLiBJbiB0aGlzIGNhc2UsIGluY2x1ZGVzIHRoZSBwYXJpc2hlcyB3aGljaCBjb250YWluIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgYWJvcnRpdmUgZGF0YSBmcmFtZSBhbmQgYWxsIHRoZSAxMDYgcGFyaXNoZXMgd2l0aCBubyBkYXRhLCBmcm9tIHRoZSBzaGFwZWZpbGUKCmBgYHtyfQpsZWZ0am9pbmVkX2Fib3J0aXZlIDwtIGxlZnRfam9pbihwYXJpc2hlc18xNjcxLCBhYm9ydGl2ZSwgYnkgPSAiT01FS0FfUEFSIikKbWFwX2xlZnRqb2luZWRfYWJvcnRpdmUgPC0gYXMuZGF0YS5mcmFtZShsZWZ0am9pbmVkX2Fib3J0aXZlKQptYXBfbGVmdGpvaW5lZF9hYm9ydGl2ZQpgYGAKCmBgYHtyfQpjZW50cm9pZHMgPC0gc3RfY2VudHJvaWQobGVmdGpvaW5lZF9hYm9ydGl2ZSRnZW9tZXRyeSkKCiMgQWRkIGNlbnRyb2lkcyB0byB0aGUgZGF0YSBmcmFtZQpsZWZ0am9pbmVkX2Fib3J0aXZlJGNlbnRyb2lkX3ggPC0gc3RfY29vcmRpbmF0ZXMoY2VudHJvaWRzKVssICJYIl0KbGVmdGpvaW5lZF9hYm9ydGl2ZSRjZW50cm9pZF95IDwtIHN0X2Nvb3JkaW5hdGVzKGNlbnRyb2lkcylbLCAiWSJdCgpwbG90X2F2X2FsbCA8LSBnZ3Bsb3QoZGF0YSA9IGxlZnRqb2luZWRfYWJvcnRpdmUgLCBhZXMoZmlsbCA9IFgxNjY1ICkpICsKICBnZW9tX3NmKCkgKwogIGdlb21fdGV4dChhZXMoeCA9IGNlbnRyb2lkX3gsIHkgPSBjZW50cm9pZF95LCBsYWJlbCA9IE9NRUtBX1BBUiksCiAgICAgICAgICAgIGNvbG9yID0gImdyZXkiLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgYWxwaGE9MCkrCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gInJlZCIsIG5hLnZhbHVlID0gImdyYXkiLAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArCiAgdGhlbWVfdm9pZCgpCgojIENvbnZlcnQgZ2dwbG90IHRvIHBsb3RseQpwbG90bHlfbWFwX2FsbCA8LSBnZ3Bsb3RseShwbG90X2F2X2FsbCkKCiMgRGlzcGxheSB0aGUgaW50ZXJhY3RpdmUgcGxvdApwbG90bHlfbWFwX2FsbApgYGAKCiMjIyMgTm93IHdlIGRvIHRoZSBzYW1lIHdpdGggdGhlIGluZmFudHMgZGF0YSBzZXQKCmBgYHtyfQpsZWZ0am9pbmVkX2luZmFudCA8LSBsZWZ0X2pvaW4ocGFyaXNoZXNfMTY3MSwgaW5mYW50LCBieSA9ICJPTUVLQV9QQVIiKQpgYGAKCmBgYHtyfQptYXBfaW5mYW50c19kZiA8LSBhcy5kYXRhLmZyYW1lKGxlZnRqb2luZWRfaW5mYW50KQptYXBfaW5mYW50c19kZgpgYGAKCmBgYHtyfQpjZW50cm9pZHMgPC0gc3RfY2VudHJvaWQobGVmdGpvaW5lZF9pbmZhbnQkZ2VvbWV0cnkpCgojIEFkZCBjZW50cm9pZHMgdG8gdGhlIGRhdGEgZnJhbWUKbGVmdGpvaW5lZF9pbmZhbnQkY2VudHJvaWRfeCA8LSBzdF9jb29yZGluYXRlcyhjZW50cm9pZHMpWywgIlgiXQpsZWZ0am9pbmVkX2luZmFudCRjZW50cm9pZF95IDwtIHN0X2Nvb3JkaW5hdGVzKGNlbnRyb2lkcylbLCAiWSJdCgpwbG90X2luZl9hbGwgPC0gZ2dwbG90KGRhdGEgPSBsZWZ0am9pbmVkX2luZmFudCwgYWVzKGZpbGwgPSBYMTY2OSApKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3RleHQoYWVzKHggPSBjZW50cm9pZF94LCB5ID0gY2VudHJvaWRfeSwgbGFiZWwgPSBPTUVLQV9QQVIpLAogICAgICAgICAgICBjb2xvciA9ICJncmV5Iiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UsIGFscGhhPTApKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiLCBuYS52YWx1ZSA9ICJncmF5IiwKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMTAwLCAyMDAsIDMwMCwgNDAwLCA1MDAsIDYwMCwgNzAwLCA4MDApLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpjb21tYV9mb3JtYXQoKSkgKwogIHRoZW1lX3ZvaWQoKQoKIyBDb252ZXJ0IGdncGxvdCB0byBwbG90bHkKcGxvdGx5X2luZl9hbGwgPC0gZ2dwbG90bHkocGxvdF9pbmZfYWxsKQoKIyBEaXNwbGF5IHRoZSBpbnRlcmFjdGl2ZSBwbG90CnBsb3RseV9pbmZfYWxsCmBgYAo=